/**
 * 
 */
package com.monkeyboy.security.social.qq.connect;

import java.nio.charset.Charset;

import org.apache.commons.lang.StringUtils;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

/**
 * 通过QQAuth2Template 获取到accessToken，然后再去请求授权拿到Connection然后去获取相应的用户数据组
 * 装成SpringSecrity的SocialAuthentication
 *
 * @author Gavin<br>
 *         2019年9月14日
 */
public class QQAuth2Template extends OAuth2Template {

	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		System.out.println("获取accessToken的响应" + responseStr);
		String[] items = StringUtils.splitByWholeSeparator(responseStr, "&");
		String accessToken = StringUtils.substringAfterLast(items[0], "=");// token
		Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));// 失效时间
		String refreshToken = StringUtils.substringAfterLast(items[2], "=");// 刷新token
		System.out.println("accessToken: " + accessToken);
		System.out.println("expiresIn: " + expiresIn);
		System.out.println("refreshToken: " + refreshToken);
		return new AccessGrant(accessToken, null, refreshToken, expiresIn);
	}

	@Override
	protected RestTemplate createRestTemplate() {// 坑：默认RestTemplate是没有处理String类型的消息数据，所以这儿要重新添加一个处理String类型数据的converter
		RestTemplate restTemplate = super.createRestTemplate();
		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
		return restTemplate;
	}

	/**
	 * @param clientId
	 * @param clientSecret
	 * @param authorizeUrl
	 * @param authenticateUrl
	 * @param accessTokenUrl
	 */
	public QQAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
		super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
		setUseParametersForClientAuthentication(true);// 需要携带client和clientSecret，详情请查看OAuth2Template源代码
	}

}
